package com.heima.media.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.heima.common.dto.PageResponseResult;
import com.heima.common.dto.ResponseResult;
import com.heima.common.dto.User;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.common.util.UserThreadLocalUtil;
import com.heima.media.dto.ContentDto;
import com.heima.media.dto.ImageDto;
import com.heima.media.dto.WmNewsDto;
import com.heima.media.dto.WmNewsPageDto;
import com.heima.media.entity.WmNews;
import com.heima.media.entity.WmNewsMaterial;
import com.heima.media.mapper.WmNewsMapper;
import com.heima.media.service.IWmNewsMaterialService;
import com.heima.media.service.IWmNewsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Service
public class WmNewsServiceImpl extends ServiceImpl<WmNewsMapper, WmNews> implements IWmNewsService {

    @Override
    public ResponseResult listByCondition(WmNewsPageDto dto) {
        //        如果没有登录人 直接报错
        User user = UserThreadLocalUtil.getUser();
        if(user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
        }

        LambdaQueryWrapper<WmNews> queryWrapper = new LambdaQueryWrapper<>();
        //     当前登录人
        queryWrapper.eq(WmNews::getUserId,user.getUserId());
//        状态
        if (dto.getStatus()!=null) {
            queryWrapper.eq(WmNews::getStatus,dto.getStatus());
        }
//        标题
        if (StringUtils.isNotBlank(dto.getKeyword())) {
            queryWrapper.like(WmNews::getTitle,dto.getKeyword());
        }

        //       频道
        if (dto.getChannelId()!=null) {
            queryWrapper.like(WmNews::getChannelId,dto.getChannelId());
        }
//        发布时间
        if (dto.getBeginPubDate()!=null&&dto.getEndPubDate()!=null) {
//            BeginPubDate < =  发布时间 < = EndPubDate
            queryWrapper.ge(WmNews::getPublishTime,dto.getBeginPubDate());
            queryWrapper.le(WmNews::getPublishTime,dto.getEndPubDate());
        }
//        发布时间排序  降序
        queryWrapper.orderByDesc(WmNews::getPublishTime);

        Page<WmNews> page = new Page<>(dto.getPage(),dto.getSize());

        Page<WmNews> page1 = this.page(page, queryWrapper);

        return new PageResponseResult(dto.getPage(),dto.getSize(),page1.getTotal(),page1.getRecords());
    }

    @Override
    public ResponseResult<WmNews> submit(WmNewsDto dto) {
        //        如果没有登录人 直接报错
        User user = UserThreadLocalUtil.getUser();
        if(user==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
        }


        if (dto.getId()!=null) {
//            删除这个文章之前关联的素材关系  delete from wm_news_material where news_id=??
            deleteRelation(dto.getId());
        }

//        构建一个wmNews
        WmNews wmNews = new WmNews();
//        BeanUtils是spring下的工具类
        BeanUtils.copyProperties(dto,wmNews); //复制时 属性名和数据类型都一致

        List<ImageDto> imageDtoList = dto.getImages(); //封面图片
//        userId
        wmNews.setUserId(user.getUserId());
        //        createdTime
        wmNews.setCreatedTime(new Date());
//                type 如果是-1 需要处理

        //            需要获取到内容中图片
        List<ImageDto> contentImageList   = getImagesFromContent(wmNews.getContent());

        if(dto.getType()==-1){//   0  1  3

          int size = contentImageList.size();
          if(size==0){
              wmNews.setType(0);  //封面无图片
          }else if(size>0&&size<3){
              wmNews.setType(1);   //封面图片只有一张
              imageDtoList  = contentImageList.subList(0,1); //截取集合 0起始位置  1 截取1个
          }else{
              wmNews.setType(3);
              imageDtoList  = contentImageList.subList(0,3); //截取集合 0起始位置  3 截取3个
          }
        }
//                images //封面图片
        wmNews.setImages(JSON.toJSONString(imageDtoList));
        this.saveOrUpdate(wmNews);

//        判断是否为草稿 status
        if (dto.getStatus()==1) {  //不是草稿
////            获取内容图片
//            contentImageList   type0  wmNews.getId()
////           获取封面图片
//           imageDtoList     type1
            saveRelation(contentImageList, wmNews.getId(),0);
            saveRelation(imageDtoList, wmNews.getId(),1);

        }

        return ResponseResult.okResult();
    }

    private void saveRelation(List<ImageDto> contentImageList, Integer newsId, int type) {
        int ord = 0;
        for (ImageDto imageDto : contentImageList) {
            WmNewsMaterial wmNewsMaterial = new WmNewsMaterial();
//            wmNewsMaterial.setId();  主键自增
            wmNewsMaterial.setMaterialId(imageDto.getId());
            wmNewsMaterial.setNewsId(newsId);
            wmNewsMaterial.setType(type);
            wmNewsMaterial.setOrd(ord);
            ord++;
            wmNewsMaterialService.save(wmNewsMaterial);
        }
    }

    private List<ImageDto> getImagesFromContent(String content) {
        List<ImageDto> imageDtoList = new ArrayList<>();
//        "content":"[
//        {
//            "type":"text",
//             "value":"随着智能手机的普及，人们更加习惯于通过手机来看新闻。由于生活节奏的加快，很多人只能利用碎片时间来获取信息，因此，对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑马头条项目采用当下火热的微服务+大数据技术架构实现。本项目主要着手于获取最新最热新闻资讯，通过大数据分析用户喜好精确推送咨询新闻"
//        },
//        {
//            "type":"image",
//            "value":"http://192.168.200.130/group1/M00/00/00/wKjIgl5swbGATaSAAAEPfZfx6Iw790.png",
//            "id" :176
//        }
//]"
//        把content字符串反序列化成一个List集合
        List<ContentDto> contentDtoList = JSON.parseArray(content, ContentDto.class);
        for (ContentDto contentDto : contentDtoList) {
            if (contentDto.getType().equals("image")) {
                ImageDto imageDto = new ImageDto();
                imageDto.setId(contentDto.getId());
                imageDto.setUrl(contentDto.getValue());
                imageDtoList.add(imageDto);
            }
        }

        return imageDtoList;
    }

    @Autowired
    private IWmNewsMaterialService wmNewsMaterialService;

    private void deleteRelation(Integer newsId) {   //删除这个文章之前关联的素材关系  delete from wm_news_material where news_id=??
        LambdaQueryWrapper<WmNewsMaterial> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(WmNewsMaterial::getNewsId,newsId);
        wmNewsMaterialService.remove(queryWrapper);
    }
}
